home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-24 | 25.2 KB | 1,513 lines |
- .title Condrv.sys Manager XCONT
-
- PROGRAM: .reg 'xcont'
- VERSION: .reg '0.60'
- DATE: .reg '1998/06/25'
- AUTHOR: .reg 'ùºë╘éªéΦÄq'
-
-
- #symbol
- # __CRLF__ CRLFëⁿìsé≡Åoù═é╖éΘ(ûóÆΦï`Ä₧é═LFëⁿìs).
- # __OLD_FUNC__ -xé╠âoâbâtâ@âèâôâOÆΓÄ~é═movemé≡rtsé╔Åæé½è╖éªéΘ.
- # (ûóÆΦï`Ä₧é═âVâXâeâÇâRü[âï$24é≡Ägéñ).
- # SLASH_CNV Ä└ìsâtâ@âCâïîƒì⌡Ä₧é╔ '/' -> '\'
-
-
- * Include File -------------------------------- *
-
- .include dos.mac
- .include macro.mac
- .include fefunc.mac
- .include console.mac
- .include doscall.mac
- .include iocscall.mac
-
-
- * âXâîâbâhè╟ù¥Åεò±é╠ì\æó ---------------------- *
-
- .offset 0
- BG_NextThread: .ds.l 1
- BG_WaitFlag: .ds.b 1
- BG_Count: .ds.b 1
- BG_CountMax: .ds.b 1
- BG_DosCmd: .ds.b 1
- BG_PSP: .ds.l 1
- BG_USP: .ds.l 1
- BG_RegSave: .ds.l 15
- BG_SR: .ds 1
- BG_PC: .ds.l 1
- BG_SSP: .ds.l 1
- BG_InDosFlag: .ds.w 1
- BG_InDosPtr: .ds.l 1
- BG_Buffer: .ds.l 1
- BG_Name: .ds.b 16
- BG_WaitTime: .ds.l 1
- *BG_MemoryTop: .ds.l 1
- *BG_MemoryEnd: .ds.l 1
- BG_SIZE:
- .fail $.ne.(124-8)
-
-
- * Fixed Number -------------------------------- *
-
- ARG_BUF_SIZE: .equ 32*1024
- STACK_SIZE: .equ 8*1024
- EXEC_NAME_SIZE: .equ 128
-
- BG_USP_SIZE: .equ 64+466
- BG_SSP_SIZE: .equ 5*1024
- .fail STACK_SIZE<(BG_USP_SIZE+BG_SSP_SIZE)
-
- .offset 0
- syscall_adr: .ds.l 1
- arg_buf_adr: .ds.l 1
- exec_name: .ds.b EXEC_NAME_SIZE
- thread_buf: .ds.b BG_SIZE
- .even
- priority: .ds 1
- .ds.b STACK_SIZE
- stack_end:
- work_size:
-
- STDIN_ATR: .equ $80c1
- STDOUT_ATR: .equ $80c2
- RTS_CODE: .equ $4e75
- MOVEM_CODE: .equ $48e7
-
- *EXIT_SUCCESS: .equ 0
- EXIT_NOCONDRV: .equ 1
- EXIT_NOMEM: .equ 2
- EXIT_ARGERR: .equ 3
- EXIT_IOERR: .equ 4
- EXIT_NOTSUPP: .equ 5
- EXIT_STACKERR: .equ 6
- EXIT_EXECERR: .equ 7
- EXIT_KEEPERR: .equ 8
- EXIT_BGERR: .equ 9
-
-
- * CONDRV.SYS ôαòöì\æóé╠ÆΦï` ------------------- *
-
- CONDRV_MARK: .equ 'hmk*'
- bufstruct_size: .equ 32
-
- .offset -28
- option_flag: .ds.b 1
- .even
- wait_count: .ds 1
- wait_init: .ds 1
- syscall_adr_: .ds.l 1
- .ds.b 1 ;ûóÄgùp?
- winkey_flag: .ds.b 1
- bufinp_addr: .ds.l 1
- keybuf_len: .ds.l 1
- keybuf_addr: .ds.l 1
- condrv_mark: .ds.l 1
- .fail *.ne.0
- key_init_entry:
-
- option_f_bit: .equ 0
- option_bg_bit: .equ 1
- option_j_bit: .equ 7
-
- * âVâXâeâÇâRü[âï
- COND_ONOFF: .equ $0000
- COND_STACK: .equ $0023
- COND_LEVEL: .equ $0024
- COND_GETVER: .equ -1 ;$ffff
-
-
- * Text Section -------------------------------- *
-
- .cpu 68000
-
- .text
- .even
-
- **** ü½ é▒é▒é⌐éτÅφÆôòö ü½ ****
-
- start_:
- bra.s @f
- hupair_mark:
- .dc.b '#HUPAIR',0
- @@:
- bra start_2
-
- bg_start_0:
- DOS _CHANGE_PR
- bg_start:
- move.b (start_-$100+4,pc),d0
- not.b d0
- bne bg_start_0 ;ÅφÆôÅIù╣é╖éΘé▄é┼æ╥ï@
-
- lea (bg_spsave,pc),a0
- move.l sp,(a0)
-
- pea (bg_start_2,pc)
- move #_ERRJVC,-(sp)
- DOS _INTVCS
- addq.l #6,sp
- bg_start_2:
- movea.l (bg_spsave,pc),sp
-
- lea (bg_com_id,pc),a0
- moveq #-1,d1
- moveq #0,d2
- move (bg_sleep_cnt,pc),d2
- bg_loop:
- cmp (a0),d1
- beq bg_keysns ;Æ╩ÉMâfü[â^é╚é╡
- move (bg_com_cmd,pc),d0
- move d1,(a0) ;Æ╩ÉMïûë┬
-
- cmpi #THREAD_KILL,d0
- bne @f
- DOS _KILL_PR ;Ä⌐î╚öjèⁿ
- * bra bg_keysns
- @@:
- cmpi #THREAD_SLEEP,d0
- bne bg_keysns
- clr.l -(sp) ;ëiïvâXâèü[âv
- DOS _SLEEP_PR
- addq.l #4,sp
- bra bg_keysns
-
- bg_keysns_input:
- IOCS _B_KEYINP ;SHIFT/CTRL/OPT.1/2 é═ô╟é▌Ä╠é─éΘ
- bg_keysns:
- IOCS _B_KEYSNS
- cmpi #$7000,d0
- bcc bg_keysns_input
-
- move.l d2,-(sp) ;Äbé¡âXâèü[âvé╖éΘ
- DOS _SLEEP_PR
- addq.l #4,sp
- bra bg_loop
-
- bg_combuf:
- .dc.l 0 ;length
- .dc.l 0 ;buffer address
- bg_com_cmd: .dc 0 ;command no.
- bg_com_id: .dc -1 ;sender ID
-
- bg_sleep_cnt: .dc 50 ;0.05òb
-
- bg_spsave: .ds.l 1
-
- **** ü¬ é▒é▒é▄é┼ÅφÆôòö(Ä└ìsâRü[âh) ü¬ ****
-
-
- * âXâîâbâhé≡ïNô«é╡é─é⌐éτÅφÆôÅIù╣é╖éΘé▄é┼é╠è╘üAbg_usp_bottomê╚ì~é═ïNô«
- * é╡é╜âXâîâbâhé╠âXâ^âbâNé╞é╡é─Ägùpé│éΩé─é╡é▄éóÄ└ìsÆåé╠âRü[âhé≡öjë≤é╡é─
- * é╡é▄éñï░éΩé¬éáéΘé╠é┼üAÅφÆôé╔òKùvé╚âïü[â`âôé═ÅφÆôòöé╠êΩòöé╞é╡é─ïLÅqé╖éΘ.
-
-
- * ÅφÆôÄ₧é╔Ägùpé╖éΘâTâuâïü[â`âô
-
- * condrv(em).sysé╠BGâtâëâOé≡âZâbâg/âNâèâAé╖éΘ.
- * in d0.l 0:âNâèâA 1:âZâbâg
- * a0.l get_condrv_worké╠ò╘Æl
-
- bitchg_bg_flag:
- PUSH a0-a1
- move.l d0,-(sp)
- lea (option_flag,a0),a1
- IOCS _B_BPEEK
-
- move.b d0,d1
- moveq #option_bg_bit,d0
- bclr d0,d1
- tst.l (sp)+
- beq @f ;in.d0=0é╚éτâNâèâA
- bset d0,d1 ; =1é╚éτâZâbâg
- @@:
- subq.l #1,a1
- IOCS _B_BPOKE
- POP a0-a1
- rts
-
- * ÅφÆôâïü[â`âô
-
- openpr_and_keep:
- bsr print_title
- pea (keep_mes,pc)
- DOS _PRINT
-
- clr.l (sp) ;âüâéâèé≡æSé─ë≡ò·é╖éΘ
- DOS _MFREE
-
- pea (100) ;Åëè·âXâèü[âvÄ₧è╘0.1òb
- pea (bg_combuf,pc) ;Æ╩ÉMâoâbâtâ@
- pea (bg_start,pc) ;Åëè·pc
- .if 0
- clr -(sp) ;Åëè·sr
- .else
- move #$2000,-(sp) ;supervisor mode
- .endif
- pea (bg_ssp_bottom,pc) ;Åëè·ssp
- pea (bg_usp_bottom,pc) ;Åëè·usp
- move (priority,a6),-(sp) ;Ä└ìsùDɵâîâxâï
- pea (thread_name,pc) ;âXâîâbâhû╝
- DOS _OPEN_PR
- lea (28,sp),sp
- tst.l d0
- bmi keep_error
-
- moveq #1,d0
- bsr bitchg_bg_flag
-
- clr -(sp)
- pea (bg_ssp_bottom-start_).w
- DOS _KEEPPR
-
- bg_end:
-
- bg_usp_bottom: .equ bg_end+BG_USP_SIZE
- bg_ssp_bottom: .equ bg_end+BG_USP_SIZE+BG_SSP_SIZE
-
- **** ü¬ é▒é▒é▄é┼ÅφÆôòö ü¬ ****
-
- start_2:
- pea (end_-start_+work_size+$f0)
- pea (16,a0)
- DOS _SETBLOCK
- tst.l d0
- bmi memory_error
- lea (end_,pc),a6
- lea (stack_end,a6),sp
-
- clr.l (syscall_adr,a6)
- bsr get_condrv_work
- bne @f
-
- lea (syscall_adr_,a1),a1
- IOCS _B_LPEEK
- move.l d0,(syscall_adr,a6)
- @@:
- pea (ARG_BUF_SIZE) ê°Éöò£î│ùpâoâbâtâ@é≡èmò█é╖éΘ
- move #2,-(sp) Åπê╩é⌐éτîƒì⌡
- DOS _MALLOC2
- addq.l #6,sp
- move.l d0,(arg_buf_adr,a6)
- bmi memory_error
- movea.l d0,a1
-
- tst.b (a2)+
- beq @f
- lea (a2),a0
- bsr DecodeHUPAIR
- move.l d0,d7 ê°Éöé╠Éö
- @@:
- beq check_stdin_redirect
-
- subq #1,d7
- moveq #0,d6 (ï≤é┼é╚éó)ê°Éöé¬êΩôxé┼éαéáé┴é╜é⌐
- arg_loop:
- move.l a1,-(sp)
- lea (a1),a0
- move.b (a0)+,d0
- beq next_arg_skip
- cmpi.b #'-',d0
- beq check_option
-
- lea (command_list,pc),a2
- moveq #0,d1
- command_check_loop:
- bsr strcmp
- bne @f êßéñ
- tst.b (a2)+
- beq command_found
- @@:
- tst.b (a2)+
- bne @b
- addq #2,d1
- tst.b (a2)
- bne command_check_loop
- bra argument_err
- command_found:
- move (@f,pc,d1.w),d1
- jsr (@f,pc,d1.w)
- bra next_arg
- @@:
- .dc command_on-@b
- .dc command_off-@b
- .dc command_x-@b
- .dc command_xon-@b
- .dc command_xoff-@b
- .dc command_k-@b
- .dc command_kon-@b
- .dc command_koff-@b
- .dc command_push-@b
- .dc command_pop-@b
- .dc command_check-@b
- .dc command_ver-@b
-
- check_option:
- move.b (a0)+,d0
- cmpi.b #'-',d0
- beq check_long_option
- next_opt: cmpi.b #'?',d0
- beq print_usage
- ori.b #$20,d0
- lea (option_table,pc),a2
- @@:
- move.l (a2)+,d1
- beq argument_err
- cmp.b d0,d1
- bne @b
- swap d1
- adda d1,a2
- jsr (a2)
- move.b (a0)+,d0 âIâvâVâçâôé═æ▒é»é─éαéµéó
- bne next_opt
- next_arg:
- moveq #-1,d6
- next_arg_skip:
- movea.l (sp)+,a1
- @@: tst.b (a1)+ ăé╠ê°Éö
- bne @b
- dbra d7,arg_loop
- tst d6
- bne exit
- bra check_stdin_redirect
-
- check_long_option:
- move.b (a0),d0
- lea (str_help,pc),a2
- cmp.b (a2),d0
- seq d0 ;$ff = --help
- beq @f
- addq.l #str_version-str_help,a2
- @@:
- cmpm.b (a2)+,(a0)+
- bne argument_err
- tst.b (-1,a0)
- bne @b
- tst.b d0
- bne option_h
- bra option_v
-
-
- * ê°ÉöÅ╚ù¬Ä₧ --------------------------------- *
-
- check_stdin_redirect:
- clr.l -(sp)
- DOS _IOCTRL
- addq.l #4,sp
- cmpi #STDIN_ATR,d0
- beq print_onoff STDINÉ╪éΦè╖éªé╚é╡
-
- lea (stdin,pc),a0
- bsr option_l É╪éΦè╖éªéτéΩé─éóé╜ÅΩìçé═ XCONT -L- é╞î⌐é╚é╖
- exit: DOS _EXIT
-
- print_onoff:
- tst.l (syscall_adr,a6) *
- beq print_off * ûóÅφÆôÄ₧é═offé≡ò\Ī
-
- bsr get_bufinp_addr
- IOCS _B_WPEEK
- subi #MOVEM_CODE,d0
- print_on_off:
- lea (on_mes,pc),a0
- beq print_a0_exit
- print_off:
- lea (off_mes,pc),a0
- print_a0_exit:
- move.l a0,-(sp)
- print_exit: DOS _PRINT
- DOS _EXIT
-
- * âRâ}âôâh în --------------------------------- *
-
- command_x:
- move.l (syscall_adr,a6),d0
- beq print_level ;ûóÅφÆôÄ₧é═ 0 é≡ò\Ī
-
- moveq #0,d1 ;ÆΓÄ~âîâxâïé╠Ä√ô╛
- bsr call_stop_level
- print_level:
- lea (buffer,pc),a0
- pea (a0)
- FPACK __LTOS ;ò╢ÄÜù±é╔ò╧è╖
- bra print_line
-
- command_k:
- tst.l (syscall_adr,a6) *
- beq print_off * ûóÅφÆôÄ₧é═offé≡ò\Ī
-
- bsr get_condrv_work
- moveq #winkey_flag,d1
- bsr bpeek
- tst.b d0
- bra print_on_off
-
- command_on:
- move #1,d1 ;ĵéΦì₧é▌èJÄn
- bra @f
- command_off:
- move #0,d1 ;ĵéΦì₧é▌ÆΓÄ~
- @@: tst.l (syscall_adr,a6)
- beq command_on_off_return ;ûóÅφÆôÄ₧é═ë╜éαé╡é╚éó
-
- moveq #COND_ONOFF,d1
- bsr call_sys_call
- bra conctrl_fncmod
-
- command_kon:
- moveq #0,d2
- bra @f
- command_koff:
- moveq #-1,d2
- @@:
- tst.l (syscall_adr,a6) *
- beq command_on_off_return * ûóÅφÆôÄ₧é═ë╜éαé╡é╚éó
-
- bsr get_condrv_work
- lea (winkey_flag,a0),a1
- move d2,d1
- IOCS _B_BPOKE
- command_on_off_return:
- rts
-
- command_check:
- clr -(sp)
- bsr get_condrv_work
- beq @f
- addq #1,(sp)
- @@:
- DOS _EXIT2
-
- command_ver:
- tst.l (syscall_adr,a6) *
- beq condrv_err * ægé▌ì₧é▄éΩé─éóé╚é»éΩé╬âGâëü[
-
- bsr get_cond_ver
- lea (ver_print_buf,pc),a0
- move.l d0,(a0)
- bmi condrv_err2
- bra print_a0_exit
-
- command_push:
- moveq #1,d1
- bra @f
- command_pop:
- pea (conctrl_fncmod,pc) POPÄ₧é═âVâXâeâÇâXâeü[â^âXé≡Åæé½Æ╝é╖
- moveq #0,d1
- @@:
- tst.l (syscall_adr,a6) *
- beq @f * ûóÅφÆôÄ₧é═ë╜éαé╡é╚éó
-
- moveq #COND_STACK,d0
- bsr call_sys_call
- tst.l d0
- bmi stack_error
- @@:
- rts
-
- * âIâvâVâçâô --------------------------------- *
-
- option_table:
- .irpc %a,hvfjlxzr
- .dc (option_%a-$-4),'&%a'
- .endm
- .dc.l 0
-
- str_help: .dc.b 'help',0
- str_version: .dc.b 'version',0
- .even
-
- option_h:
- print_usage:
- bsr print_title
- pea (usage_mes,pc)
- bra print_exit
-
- option_v:
- pea (version_mes,pc)
- lea (version_mes_end,pc),a0
- bra print_line
-
- * ûûö÷é╔ CRLF é≡òtë┴é╡é─ò\Ī.
- * in (sp).l ò╢ÄÜù±é╠ɵô¬âAâhâîâX
- * a0.l ûûö÷
-
- print_line:
- .ifdef __CRLF__
- move.b #CR,(a0)+
- .endif
- move.b #LF,(a0)+
- clr.b (a0)
- bra print_exit
-
- option_f:
- pea (conctrl_fncmod,pc)
- moveq #1.shl.option_f_bit,d2
- bra @f
- option_j:
- moveq #1.shl.option_j_bit,d2
- @@:
- moveq #1,d1
- bsr is_number
- bmi @f ;ÉöÆlÅ╚ù¬Ä₧é═1
- bsr get_value
- @@: subq.l #1,d1
- bhi over_val_err
- seq d3 d3=-1:$.or.d2 d3=0:($.or.d2).eor.d2
-
- tst.l (syscall_adr,a6) *
- beq option_fj_return * ûóÅφÆôÄ₧é═ë╜éαé╡é╚éó
-
- move.l a0,-(sp)
- bsr get_condrv_work
- lea (option_flag,a0),a1
- IOCS _B_BPEEK
- movea.l (sp)+,a0
-
- or.b d2,d0
- tst.b d3
- bmi @f
- eor.b d2,d0
- @@:
- move.b d0,d1
- subq.l #1,a1
- IOCS _B_BPOKE
- option_fj_return:
- rts
-
- option_l:
- bsr check_filearg
-
- moveq #STDIN,d5
- move.b (a0),-(sp)
- move (sp)+,d0
- move.b (1,a0),d0
- cmp (stdin,pc),d0
- beq @f -L - é╠ÅΩìçé═òWÅÇôⁿù═é⌐éτô╟é▐
-
- clr -(sp)
- move.l a0,-(sp)
- DOS _OPEN
- addq.l #6,sp
- move.l d0,d5
- bmi fopen_error
- @@:
- moveq #0,d2 d2=-1:òWÅÇôⁿù═âfâoâCâX
-
- move d5,-(sp)
- clr -(sp)
- DOS _IOCTRL
- tst.l d0
- bmi ioctrl_error
- tst.b d0
- bpl @f âuâìâbâNâfâoâCâXÅπé╠âtâ@âCâïé═ 0 é¬ò╘éΘ
-
- ori.b #%0111_1110,d0
- addq.b #1,d0
- seq d2 CharDev&&STDINé┼CONé⌐éτé╠ôⁿù═é╞é▌é╚é╖
-
- addq #6,(sp)
- DOS _IOCTRL
- tst.l d0 -1.l é┼ôⁿù═ë┬
- beq cannot_input_error ôⁿù═òsë┬é╠âLâââëâNâ^âfâoâCâX
- @@:
- addq.l #4,sp
-
- tst.l (syscall_adr,a6) *
- beq end_of_file * ûóÅφÆôÄ₧é═ôⁿù═âtâ@âCâïé╠â`âFâbâNé╛é»é╖éΘ
-
- moveq #-1,d4
- lsr.l #8,d4
- move.l d4,-(sp)
- DOS _MALLOC
- and.l d0,d4
- lsr.l #1,d4 æSâtâèü[âüâéâèé╠ö╝ò¬é≡èmò█
- move.l d4,(sp)
- DOS _MALLOC
- addq.l #4,sp
- tst.l d0
- bmi memory_error
- movea.l d0,a5
-
- *XCON é≡âIü[âvâôé╖éΘ
- move #WOPEN,-(sp)
- pea (xcon,pc)
- DOS _OPEN
- addq.l #6,sp
- tst.l d0
- bmi xcon_open_error
- swap d5
- move d0,d5 d5:file|XCON
-
- move d5,-(sp)
- clr -(sp)
- DOS _IOCTRL
- tst.l d0
- bmi xcon_ioctrl_error
- tst.b d0
- bpl xcon_char_open_error òüÆ╩é╠âtâ@âCâïé≡âIü[âvâôé╡é─é╡é▄é┴é╜
-
- addq #7,(sp)
- DOS _IOCTRL
- addq.l #4,sp
- tst.l d0 -1.l é┼Åoù═ë┬
- beq cannot_output_error
-
- * òWÅÇÅoù═é¬É╪éΦè╖éªéτéΩé─éóéΘé⌐Æ▓é╫éΘ
- moveq #0,d3 d3.hw=0:É╪éΦè╖éªé╚é╡
- pea (STDOUT) $0000_0001
- DOS _IOCTRL
- addq.l #4,sp
- cmpi #STDOUT_ATR,d0
- beq @f
- moveq #-1,d3 d3.hw=-1:éáéΦ(ù╝ò√é╔Åæé½ì₧é▐)
- @@:
- read_write_loop:
- swap d5 XCON|file
- move.l d4,-(sp)
- move.l a5,-(sp)
- move d5,-(sp)
- DOS _READ
- lea (10,sp),sp
- tst.l d0
- bmi fread_error
- beq end_of_file
-
- * òWÅÇôⁿù═é⌐éτé╠ÅΩìçé═eofé≡Æ▓é╫éΘ
- tst.b d2
- beq write_stdout
- lea (a5),a2
- subq.l #1,d0
- @@:
- move.b (a2)+,d1
- cmpi.b #$04,d1 ^D
- beq eof_found
- cmpi.b #EOF,d1
- beq eof_found
- dbra d0,@b
- clr d0
- subq.l #1,d0
- bcc @b
- bra @f
- eof_found:
- moveq #-1,d2
- @@:
- move.l a2,d0
- subq.l #1,d0
- sub.l a5,d0
- beq end_of_file ìsô¬é╔eofé¬éáé┴é╜ÅΩìç
-
- write_stdout:
- move.l d0,-(sp)
- move.l a5,-(sp)
- move #STDOUT,-(sp)
- tst.l d3
- bpl @f
- DOS _WRITE
- @@:
- * XCON é╔Åæé½ì₧é▐
- swap d5 file|XCON
- move d5,(sp)
- DOS _WRITE
- lea (10,sp),sp
-
- tst d2 eofé≡îƒÅoé╡é╜é⌐
- bpl read_write_loop
- * îπò╨òt
- end_of_file:
- DOS _ALLCLOSE
- @@: tst.b (a0)+ ìíé╠ê°Éöé═ì┼îπé▄é┼âtâ@âCâïû╝é╚é╠é┼
- bne @b û▀é┴é─é⌐éτë≡Ä▀é│éΩé╚éóéµéñé╔é╖éΘ
- subq.l #1,a0
- rts
-
- option_x:
- bsr check_filearg
-
- pea (ARG_BUF_SIZE+8)
- DOS _MALLOC
- move.l (sp)+,d6 size of ARG_BUF
- tst.l d0
- bmi memory_error
- movea.l d0,a3
- lea (8,a3),a4 #HUPAIR\0é╠ò¬
- subq.l #8,d6 üV
-
- lea (a0),a1
- lea (exec_name,a6),a5
- lea (a5),a0
- moveq #EXEC_NAME_SIZE-1,d0
- @@:
- move.b (a1)+,(a0)+
- dbeq d0,@b
- bne too_long_filename_error
-
- clr.l -(sp) è┬ï½
- move.l a4,-(sp) â_â~ü[é╠âRâ}âôâhâëâCâôâoâbâtâ@
- move.l a5,-(sp) âtâ@âCâïû╝
- move #EXEC_PATHCHK,-(sp) îƒì⌡
- DOS _EXEC
- .ifndef SLASH_CNV
- tst.l d0
- lea (14,sp),sp
- bmi load_error
- .else
- move.l d0,d1
- bpl exec_load_ok
-
- * SLASH é≡ BACKSLASH é╔ò╧éªé─ÄÄé╡é─é▌éΘ
- lea (a5),a0
- * moveq #-1,d1
- @@:
- move.b (a0)+,d0
- beq @f
- cmpi.b #'/',d0
- bne @b
- moveq #'\',d1
- move.b d1,(-1,a0)
- bra @b
- @@:
- tst d1
- bmi @f ;'/'é═ûóÄgùpé╛é┴é╜
-
- DOS _EXEC
- tst.l d0
- bpl exec_load_ok
- @@:
- lea (14,sp),sp
- move.l d1,d0 ìíôxéαâGâëü[é╚éτæOë±é╠ò╘Ælé≡Ägéñ
- bra load_error
- exec_load_ok:
- lea (14,sp),sp
- .endif /* SLASH_CNV */
-
- move.l d6,d0 âoâbâtâ@ùeù╩
- move.l d7,d1
- * addq.l #1,d1 ê°Éöé╠Éö(a1=ê°Éöù±)
- lea (a4),a0 âoâbâtâ@ɵô¬
- bsr EncodeHUPAIR
- bmi memory_error *
-
- move.l d6,d1 âoâbâtâ@ùeù╩
- lea (a4),a1 âoâbâtâ@ɵô¬
- lea (a5),a2 arg0(filename)
- bsr SetHUPAIR
- bmi memory_error *
-
- suba.l a3,a0 ê°ÉöâGâôâRü[âhâoâbâtâ@é≡
- move.l a0,-(sp) òKùvé╚ò¬é╛é»é╠æσé½é│é╔é╖éΘ
- move.l a3,-(sp)
- DOS _SETBLOCK
-
- move.l (arg_buf_adr,a6),(sp) òsùvé╔é╚é┴é╜ê°Éöò£î│âoâbâtâ@é≡ë≡ò·é╖éΘ
- DOS _MFREE
- addq.l #8,sp
-
- clr.l -(sp) è┬ï½
- move.l a4,-(sp) âRâ}âôâhâëâCâô
- move.l a5,-(sp) âtâ@âCâïû╝
- move #EXEC_LOAD,-(sp) âìü[âhé╠é▌
- DOS _EXEC
- lea (14,sp),sp
- move.l d0,d6
- bmi load_error
-
- tst.l (syscall_adr,a6)
- beq @f
-
- .ifdef __OLD_FUNC__
- bsr get_bufinp_addr *
- IOCS _B_WPEEK * î╗ì▌é╠âéü[âhé≡ô╛éΘ
- move d0,d7
-
- bsr command_off * ĵéΦì₧é▌é≡ÆΓÄ~é╖éΘ
- .else
- bsr command_xoff ;stop_level++
- move.l d0,d7
- .endif
- @@:
- move.l d7,-(sp)
- move.l a6,-(sp)
-
- move.l d6,-(sp) * exec address
- move #4,-(sp)
- DOS _EXEC
- addq.l #6,sp
-
- move.l (sp)+,a6
- move.l (sp)+,d7
- move d0,-(sp) ;exit2é╠ê°Éö
-
- tst.l (syscall_adr,a6)
- beq @f
-
- .ifdef __OLD_FUNC__
- bsr get_bufinp_addr *
- move d7,d1 * ê╚æOé╠âéü[âhé╔û▀é╖
- IOCS _B_WPOKE *
- bsr conctrl_fncmod
- .else
- tst.l d7
- bmi @f
- bsr command_xon ;stop_level--
- .endif
- @@:
- DOS _EXIT2
-
-
- * BGæ╬ë₧Åêù¥ --------------------------------- *
-
- option_z:
- moveq #2,d1
- bsr is_number
- bmi @f
- bsr get_value ;ùDɵôxé╠Ä√ô╛
- * cmpi #2,d1
- * bcs small_val_err
- cmpi #255,d1
- bhi over_val_err
- @@: move d1,(priority,a6)
-
- cmpi.b #',',(a0)
- bne @f
- addq.l #1,a0
- * bsr is_number
- * bmi @f
- bsr get_value ;âXâèü[âvÄ₧è╘é╠Ä√ô╛
- tst d1
- beq small_val_err
- lea (bg_sleep_cnt,pc),a1
- move d1,(a1)
- @@:
- bsr check_condrv
- bsr get_condrv_work
- bra openpr_and_keep
-
- * condrv(em).sysé¬ægé▌ì₧é▄éΩé─éóéΘé⌐Æ▓é╫éΘ.
- * ægé▌ì₧é▄éΩé─éóé╚é»éΩé╬üAâGâëü[ÅIù╣é╖éΘ.
-
- check_condrv:
- tst.l (syscall_adr,a6)
- beq condrv_err
- bsr get_cond_ver
- tst.l d0
- bmi condrv_err2
- rts
-
- option_r:
- bsr check_condrv
-
- lea (thread_name,pc),a0
- lea (thread_buf+BG_Name,a6),a1
- STRCPY a0,a1
-
- pea (thread_buf,a6) ;ÄwÆΦâXâîâbâhû╝é╠âXâîâbâhö╘ìåé≡Ä√ô╛é╖éΘ
- move #-1,-(sp)
- DOS _GET_PR
- move.l d0,d1
- bmi release_error
-
- subq #1,(sp) ;Ä⌐ò¬é╠âXâîâbâhö╘ìåé≡Ä√ô╛é╖éΘ
- DOS _GET_PR
- addq.l #6,sp
-
- clr.l -(sp) ;ĵéΦè╕éªé╕ïNé▒é╖
- clr.l -(sp)
- move #THREAD_WAKEUP,-(sp)
- move d1,-(sp)
- move d0,-(sp)
- DOS _SEND_PR
-
- move #THREAD_KILL,(4,sp)
- moveq #DOSE_CANTSEND,d2
- bra send_pr
- send_pr_loop:
- DOS _CHANGE_PR
- send_pr:
- DOS _SEND_PR ;Ä≤é»òté»éτéΩéΘé▄é┼
- cmp.l d2,d0 ;öjèⁿùvïüé≡îJéΦò╘é╖
- beq send_pr_loop
- tst.l d0
- lea (14,sp),sp
- bmi release_error2
-
- pea (thread_buf,a6)
- move d1,-(sp)
- get_pr_loop:
- DOS _CHANGE_PR ;öjèⁿé│éΩéΘé╠é≡èmöFé╖éΘ
- DOS _GET_PR
- tst.l d0
- bpl get_pr_loop
- addq.l #6,sp
-
- bsr get_condrv_work
- moveq #0,d0
- bsr bitchg_bg_flag
-
- bsr print_title
- pea (release_mes,pc)
- DOS _PRINT
- DOS _EXIT
-
-
- * Sub ---------------------------------------- *
-
- conctrl_fncmod:
- move.l #$000e_ffff,-(sp)
- DOS _CONCTRL
- addq.l #4,sp
- rts
-
- print_title:
- pea (title_mes,pc)
- DOS _PRINT
- addq.l #4,sp
- rts
-
- check_filearg:
- tst.b (a0)+
- bne @f
-
- dbra d7,check_filearg
- bra no_filename_error
- @@:
- subq.l #1,a0
- movea.l a0,a1
- rts
-
- get_condrv_work:
- move #$100+_KEY_INIT,-(sp)
- DOS _INTVCG
- addq.l #2,sp
- movea.l d0,a0
- moveq #condrv_mark,d1
- bsr lpeek
- cmpi.l #CONDRV_MARK,d0
- rts
-
- get_bufinp_addr:
- bsr get_condrv_work
- moveq #bufinp_addr,d1
- bsr lpeek
- movea.l d0,a1
- rts
-
- lpeek:
- moveq #_B_LPEEK,d0
- bra @f
- bpeek:
- moveq #_B_BPEEK,d0
- @@: lea (a0,d1.l),a1
- trap #15
- rts
-
- get_value:
- moveq #0,d1
- bra get_value_start
- get_value_loop:
- moveq #$f,d0
- and.b (a0)+,d0
- mulu #10,d1
- add.l d0,d1
- get_value_start:
- bsr is_number
- bpl get_value_loop
- rts
-
- is_number:
- cmpi.b #'0',(a0)
- bcs @f
- cmpi.b #'9',(a0)
- bhi @f
- moveq #0,d0
- rts
- @@: moveq #-1,d0
- rts
-
- strcmp:
- PUSH d1/a1
- @@:
- move.b (a1)+,d0
- beq @f
- ori.b #$20,d0
- move.b (a2)+,d1
- beq strcmp_not_equ
- cmp.b d0,d1
- beq @b
- @@:
- POP d1/a1
- rts
- strcmp_not_equ:
- subq.l #1,a2
- moveq #-1,d1
- bra @b
-
- get_cond_ver:
- moveq #COND_GETVER,d0
- bra call_sys_call
-
- command_xoff:
- moveq #+1,d1 ;stop_level++
- bra call_stop_level
- command_xon:
- moveq #-1,d1 ;stop_level--
- call_stop_level:
- moveq #COND_LEVEL,d0
- bra call_sys_call
-
- call_sys_call:
- move.l (syscall_adr,a6),-(sp)
- DOS _SUPER_JSR
- addq.l #4,sp
- rts
-
-
- * âGâëü[Åêù¥ --------------------------------- *
- ; exit(1):CONDRV.SYS é¬ægé▌ì₧é▄éΩé─éóé╚éó
- ; exit(2):ôαòöâGâëü[
- ; exit(3):ê°Éöé¬ê┘Åφ
- ; exit(4):âtâ@âCâïâAâNâZâXé╔Ä╕ösé╡é╜(è▄é▐XCON)
- ; exit(5):CONDRV.SYS é═ÅâÉ│òié┼éáéΘ
- ; exit(6):âXâ^âbâNæÇì∞é╠âGâëü[
- ; exit(7):âtâ@âCâïé╠Ä└ìsé╔Ä╕ösé╡é╜
- ; exit(8):xconté═è∙é╔ÅφÆôé╡é─éóéΘ/é▄é╛ÅφÆôé╡é─éóé╚éó
- ; exit(9):BGâvâìâZâXé¬ôoÿ^Åoùêé╚éó
-
- condrv_err:
- lea (condrv_err_mes,pc),a0
- moveq #EXIT_NOCONDRV,d1
- bra 1f
- condrv_err2:
- lea (condrv_err_mes2,pc),a0
- moveq #EXIT_NOTSUPP,d1
- bra 1f
-
- memory_error:
- lea (mem_err_mes,pc),a0
- moveq #EXIT_NOMEM,d1
- bra 1f
-
- stack_error:
- addq.l #1,d0
- beq condrv_err2 d0.l=-1
- lea (push_err_mes,pc),a0
- tst d2
- bne @f
- lea (pop_err_mes,pc),a0
- @@:
- moveq #EXIT_STACKERR,d1
- bra 1f
- 1:
- suba.l a1,a1
- bra error_exit
-
- argument_err:
- lea (arg_err_mes,pc),a0
- bra @f
- over_val_err:
- lea (val_err_mes,pc),a0
- bra @f
- small_val_err:
- lea (val_err_mes,pc),a0
- move.l #'żé│',(6,a0)
- bra @f
- no_filename_error:
- lea (nofilename_err_mes,pc),a0
- bra @f
- too_long_filename_error:
- lea (too_long_filename_mes,pc),a0
- movea.l (sp)+,a1
- bra @f
- @@:
- moveq #EXIT_ARGERR,d1
- bra error_exit
-
- xcon_char_open_error:
- lea (xcon_open_err_mes,pc),a0
- bra @f
- cannot_output_error:
- lea (cant_out_err_mes,pc),a0
- move #'Åo',(a0)
- bra @f
- @@:
- lea (xcon,pc),a1
- bra 1f
-
- xcon_open_error:
- bsr get_condrv_work CONDRV.SYS é¬ægé▌ì₧é▄éΩé─éóé╚ÅΩìçé═
- lea (xcon,pc),a1 âGâëü[âüâbâZü[âWéαò╧éªéΘ
- fopen_error:
- lea (fopen_mes_tbl,pc),a0
- move.b d0,(fopen_err_mes-fopen_mes_tbl,a0)
- check_open_err:
- cmp.b (a0)+,d0
- beq 1f
- @@: tst.b (a0)+
- bne @b
- bra check_open_err
- xcon_ioctrl_error:
- lea (xcon,pc),a1
- ioctrl_error:
- lea (ioctrl_err_mes,pc),a0
- bra 1f
- cannot_input_error:
- lea (cant_inp_err_mes,pc),a0
- bra 1f
- fread_error:
- lea (fread_err_mes,pc),a0
- bra 1f
- 1:
- moveq #EXIT_IOERR,d1
- bra error_exit
-
- load_error:
- lea (load_err_mes,pc),a0
- lea (a5),a1
-
- moveq #EXIT_EXECERR,d1
- bra error_exit
-
- keep_error:
- moveq #EXIT_KEEPERR,d1
- moveq #DOSE_DUPTHNAM,d2 ;è∙é╔ÅφÆôé╡é─éóéΘ
- lea (already_keep_mes,pc),a0
- cmp.l d2,d0
- beq @f
-
- moveq #EXIT_BGERR,d1
- moveq #DOSE_THFULL,d2 ;âXâîâbâhé¬êΩöt
- lea (thread_full_mes,pc),a0
- cmp.l d2,d0
- beq @f
-
- * moveq #EXIT_BGERR,d1 ;processûóÉ▌ÆΦ
- lea (proccess_err_mes,pc),a0
- bra @f
- release_error:
- lea (not_keep_mes,pc),a0
- moveq #EXIT_KEEPERR,d1
- bra @f
- release_error2:
- lea (release_err_mes,pc),a0
- moveq #EXIT_BGERR,d1
- @@:
- suba.l a1,a1
- bra error_exit
-
- error_exit:
- move #STDERR,-(sp)
- pea (xcont_mes,pc)
- DOS _FPUTS XCONT:
- move.l a0,(sp)
- DOS _FPUTS âGâëü[âüâbâZü[âW
- move.l a1,(sp)
- beq @f
- DOS _FPUTS ê°Éö
- @@: addq.l #4,sp
- pea (crlf,pc)
- DOS _FPUTS ëⁿìs
- move d1,(sp)
- DOS _EXIT2
-
-
- * HUPAIR Encoder/Decoder ---------------------- *
-
- DecodeHUPAIR:
- PUSH d1-d2/a1
- moveq #0,d0
- moveq #0,d2
- 1:
- move.b (a0)+,d1
- beq 8f
- cmpi.b #SPACE,d1
- beq 1b
-
- addq.l #1,d0
- 2:
- tst.b d2
- beq 4f
-
- cmp.b d2,d1
- bne 5f
- 3:
- eor.b d1,d2
- bra 6f
- 4:
- cmpi.b #'"',d1
- beq 3b
- cmpi.b #"'",d1
- beq 3b
-
- cmpi.b #SPACE,d1
- beq 7f
- 5:
- move.b d1,(a1)+
- beq 8f
- 6:
- move.b (a0)+,d1
- bra 2b
- 7:
- clr.b (a1)+
- bra 1b
- 8:
- POP d1-d2/a1
- tst.l d0
- rts
-
- EncodeHUPAIR:
- PUSH d1-d3/a1-a2
- move.l d0,d2
- bmi 2f
- 1:
- subq.l #1,d1
- bcc 3f
- 2:
- move.l d2,d0
- POP d1-d3/a1-a2
- rts
- 3:
- subq.l #1,d2
- bmi 2b
-
- move.b #SPACE,(a0)+
- move.b (a1),d0
- beq 5f
- 3:
- movea.l a1,a2
- sf d3
- 4:
- move.b (a2)+,d0
- beq 4f
-
- cmpi.b #'"',d0
- beq 5f
- cmpi.b #"'",d0
- beq 5f
-
- cmpi.b #SPACE,d0
- bne 4b
- st d3
- bra 4b
- 4:
- tst.b d3
- bne 5f
- 4:
- move.b (a1)+,d0
- beq 1b
- subq.l #1,d2
- bmi 2b
- move.b d0,(a0)+
- bra 4b
- 5:
- moveq #'"',d3
- cmp.b d0,d3
- bne 7f
- moveq #"'",d3
- 7:
- move.b d3,d0
- bra 6f
- 5:
- move.b (a1),d0
- beq 5f
- cmp.b d3,d0
- beq 5f
-
- addq.l #1,a1
- 6:
- subq.l #1,d2
- bmi 2b
-
- move.b d0,(a0)+
- bra 5b
- 5:
- subq.l #1,d2
- bmi 2b
-
- move.b d3,(a0)+
- bra 3b
-
- SetHUPAIR:
- PUSH d2/a2
- tst.l d0
- bmi 4f
-
- sub.l d0,d1
- beq 1f
-
- move.l d1,d2
- subq.l #1,d2
- moveq #0,d1
- subq.b #1,d1
- bhi 3f
- bra 2f
- 1:
- subq.l #1,d0
- bmi 4f
-
- lea (1,a1),a0
- moveq #0,d2
- 2:
- move.l d2,d1
- 3:
- move.b d1,(a1)
-
- subq.l #1,d0
- bmi 4f
-
- clr.b (a0)+
- 3:
- subq.l #1,d0
- bmi 4f
-
- move.b (a2)+,(a0)+
- bne 3b
-
- subq.l #8,a1
- lea (hupair_mark,pc),a2
- 3: move.b (a2)+,(a1)+
- bne 3b
-
- move.l d2,d0
- 4:
- POP d2/a2
- rts
-
-
- * Data Section -------------------------------- *
-
- .data
- .even
-
- title_mes:
- .dc.b 'Condrv.sys Manager '
- version_mes:
- .dc.b 'XCONT version ',VERSION
- version_mes_end:
- .dc.b ' ',DATE,' ',AUTHOR,'.'
- crlf: .dc.b CRLF,0
-
- **usage_mes:
- ** .dc.b 'option: on/off k/kon/koff push/pop check/ver'
- ** .dc.b ' -f/j<n> -l<file> -x<command> -z<p,s>/r',CRLF
- usage_mes:
- .dc.b 'usage: ',PROGRAM,' [option] ...',CRLF
- .dc.b 'option:',CRLF
- .dc.b ' on / off ĵéΦì₧é▌èJÄn / ÆΓÄ~',CRLF
- .dc.b ' Å╚ù¬ ĵéΦì₧é▌Å≤æ╘ò\Ī',CRLF
- .dc.b ' xon / xoff ÆΓÄ~âîâxâï++ / ÆΓÄ~âîâxâï--',CRLF
- .dc.b ' x ÆΓÄ~âîâxâïò\Ī',CRLF
- .dc.b ' kon / koff âLü[æÇì∞ïûë┬ / ï╓Ä~',CRLF
- .dc.b ' k âLü[Å≤æ╘ò\Ī',CRLF
- .dc.b ' push / pop Å≤æ╘æ▐ö≡ / ò£ïA',CRLF
- .dc.b ' check / ver ÅφÆôîƒì╕ / âoü[âWâçâôò\Ī',CRLF
- .dc.b ' -f[num] âVâXâeâÇâëâCâôò\Ī(0:ò\Ī [1]:ù}ɺ)',CRLF
- .dc.b ' -j[num] âRü[âhôⁿù═Ä₧é╠âyü[âXâgò╢ÄÜ(0:æSé─ [1]:16 ÉiÉöé╠é▌)',CRLF
- .dc.b ' -l<file> âtâ@âCâïĵéΦì₧é▌',CRLF
- .dc.b ' -x<cmd> ... ĵéΦì₧é▌é≡ÆΓÄ~é╡é─âtâ@âCâïÄ└ìs',CRLF
- .dc.b ' -z[p],[s] ÅφÆô(p:ùDɵÅçê╩ s:âXâèü[âvÄ₧è╘)',CRLF
- .dc.b ' -r ÅφÆôë≡Å£',CRLF
- .dc.b 0
-
- command_list:
- .dc.b 'on',0
- .dc.b 'off',0
- .dc.b 'x',0
- .dc.b 'xon',0
- .dc.b 'xoff',0
- .dc.b 'k',0
- .dc.b 'kon',0
- .dc.b 'koff',0
- .dc.b 'push',0
- .dc.b 'pop',0
- .dc.b 'check',0
- .dc.b 'ver',0
- .dc.b 0
-
- .even
- stdin: .dc.b '-',0
- .even
- ver_print_buf: .dc.b 0,0
- * .dc.b 'e08b',CRLF
- on_mes: .dc.b 'on',CRLF,0
- off_mes: .dc.b 'off',CRLF,0
-
- xcont_mes: .dc.b PROGRAM,':',0
- xcon: .dc.b 'xcon',0
-
- thread_name: .dc.b 'condrvd',0
-
- condrv_err_mes:
- .dc.b 'condrv.sysé═ægé▌ì₧é▄éΩé─éóé▄é╣é±.',0
- condrv_err_mes2:
- .dc.b 'condrv.sysé═ÅâÉ│òié┼é╖.',0
-
- mem_err_mes:
- .dc.b 'âüâéâèé¬æ½éΦé▄é╣é±.',0
-
- arg_err_mes:
- .dc.b 'ê°Éöé¬û│î°é┼é╖:',0
- nofilename_err_mes:
- .dc.b 'âtâ@âCâïû╝é≡ÄwÆΦé╡é─ë║é│éó:',0
- too_long_filename_mes:
- .dc.b 'âtâ@âCâïû╝é¬Æ╖é╖é¼é▄é╖:',0
- load_err_mes:
- .dc.b 'âtâ@âCâïé¬âìü[âhÅoùêé▄é╣é±:',0
-
- xcon_open_err_mes:
- .dc.b 'âLâââëâNâ^âfâoâCâXé¬âIü[âvâôé┼é½é▄é╣é±:',0
-
- fopen_mes_tbl: .dc.b $fe,'âtâ@âCâïé¬éáéΦé▄é╣é±:',0
- .dc.b $fd,'âfâBâîâNâgâèé¬éáéΦé▄é╣é±:',0
- .dc.b $fc,'FCBé¬æ½éΦé▄é╣é±:',0
- .dc.b $fb,'âfâBâîâNâgâè/â{âèâàü[âÇâëâxâïé═âIü[âvâôé┼é½é▄é╣é±:',0
- .dc.b $f3,'âtâ@âCâïû╝é╠ÄwÆΦé╔îδéΦé¬éáéΦé▄é╖:',0
- .dc.b $f1,'âhâëâCâuÄwÆΦé╔îδéΦé¬éáéΦé▄é╖:',0
- .dc.b $df,'ÄwÆΦé╠âtâ@âCâïé═âìâbâNé│éΩé─éóé▄é╖:',0
- fopen_err_mes: .dc.b $00,'âtâ@âCâïé¬âIü[âvâôé┼é½é▄é╣é±(é╗é╠æ╝é╠âGâëü[):',0
- ioctrl_err_mes:
- .dc.b 'IOCTRLé╔Ä╕ösé╡é▄é╡é╜:',0
- .even
- val_err_mes: ****
- .dc.b 'ÉöÆlé¬æσé½é╖é¼é▄é╖:',0
- .even
- cant_inp_err_mes:
- cant_out_err_mes: **
- .dc.b 'ôⁿù═òsë┬ö\é╚âtâ@âCâïé┼é╖:',0
- fread_err_mes:
- .dc.b 'âtâ@âCâïé¬ô╟é▀é▄é╣é±:',0
-
- push_err_mes:
- .dc.b 'é▒éΩê╚ÅπâXâ^âbâNé╔É╧é▀é▄é╣é±.',0
- pop_err_mes:
- .dc.b 'âXâ^âbâNé═ï≤é┼é╖.',0
-
- keep_mes:
- .dc.b 'ÅφÆôé╡é▄é╡é╜.',CRLF,0
- already_keep_mes:
- .dc.b 'è∙é╔ÅφÆôé╡é─éóé▄é╖.',0
- thread_full_mes:
- .dc.b 'é▒éΩê╚ÅπâoâbâNâOâëâEâôâhâvâìâZâXé≡ïNô«Åoùêé▄é╣é±.',0
- proccess_err_mes:
- .dc.b 'CONFIG.SYSé╠PROCESSé¬É▌ÆΦé│éΩé─éóé▄é╣é±.',0
-
- release_mes:
- .dc.b 'ÅφÆôë≡Å£é╡é▄é╡é╜.',CRLF,0
- not_keep_mes:
- .dc.b 'é▄é╛ÅφÆôé╡é─éóé▄é╣é±.',0
- release_err_mes:
- .dc.b 'ÅφÆôë≡Å£Åoùêé▄é╣é±é┼é╡é╜.',0
-
-
- * Block Storage Section ----------------------- *
-
- .bss
- .even
- buffer:
- end_:
-
-
- .end
-
- * End of File --------------------------------- *
-
-